package cz.stv.pecinovsky.město;

import cz.stv.pecinovsky.správceplátna.Přesouvač;
import cz.stv.pecinovsky.správceplátna.SprávcePlátna;

import cz.stv.pecinovsky.utility.Barva;
import cz.stv.pecinovsky.utility.IO;
import cz.stv.pecinovsky.utility.Pozice;

import java.util.ArrayList;
import java.util.List;


/*******************************************************************************
 * Testovací třída {@code AutoTest}  slouží ke komplexnímu otestování
 * třídy {@link AutoTest}.
 *
 * @author  Rudolf PECINOVSKÝ
 * @version 1.10.2678 — 2011-10-27
 */
public class AutoTest extends junit.framework.TestCase
{
    private SprávcePlátna SP;
    private Auto auto0;
    private Auto autoXY;
    private Auto autoXYB;
    private Auto autoXYM;
    private Auto autoXYMB;



//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param název  Název konstruovaného testu
     */
    public AutoTest( String název )
    {
        super(název);
    }



//== PŘÍPRAVA A ÚKLID PŘÍPRAVKU ================================================

    /***************************************************************************
     * Inicializace předcházející spuštění každého testu a připravující tzv.
     * přípravek (fixture), což je sada objektů, s nimiž budou testy pracovat.
     */
    @Override
    protected void setUp()
    {
        auto0    = new Auto();
        autoXY   = new Auto( 50, 100 );
        autoXYB  = new Auto(150,  25, Barva.ČERNÁ);
        autoXYM  = new Auto(200, 100,  64);
        autoXYMB = new Auto(  0, 172, 256, Barva.ČERVENÁ);

        SP = SprávcePlátna.getInstance();
        SP.přidej(auto0);
        SP.přidej(autoXY);
        SP.přidej(autoXYB);
        SP.přidej(autoXYM);
        SP.přidej(autoXYMB);

        System.out.println("\n====== Instance v přípravku pro " + this +
                           "\n| SP: " + SP +
                           "\n| auto0:    " + auto0 +
                           "\n| autoXY:   " + autoXY +
                           "\n| autoXYB:  " + autoXYB +
                           "\n| autoXYM : " + autoXYM +
                           "\n| autoXYMB: " + autoXYMB +
                           "\n======");
        IO.zpráva("Auta připravena");
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    @Override
    protected void tearDown()
    {
    }


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Vyzkouší blikání zadaného auta
     */
    private void pomBlikání(Auto auto)
    {
        auto.zhasni();
        IO.čekej(500);
        auto.blikniVlevo();
        IO.čekej(500);
        auto.blikniVpravo();
        IO.čekej(500);
        auto.rozsviť();
    }



//== INTERNÍ DATOVÉ TYPY =======================================================
//== VLASTNÍ TESTY =============================================================
//
//     /***************************************************************************
//      *
//      */
//     public void testXXX()
//     {
//     }
//

    /***************************************************************************
     *
     */
    public void testBlikání()
    {
        pomBlikání(auto0);
        pomBlikání(autoXY);
        pomBlikání(autoXYB);
        pomBlikání(autoXYM);
        pomBlikání(autoXYMB);
    }


    public void testPlynuléPosuny()
    {
        Přesouvač p = new Přesouvač(10);
        p.přesunNa(150, 150, auto0);
        p.přesunNa(  0, 200, autoXY);
        p.přesunNa(  0,   0, autoXYMB);
        p.přesunNa(150, 236, autoXYB);
        p.přesunNa(  0, 150, autoXYM);
    }


    public void testPoziceVelikost()
    {
        TestUtility.setPoziceModuly(new Pozice(50, 200), 25, 200);
        TestUtility.poziceVelikost(autoXYMB);
        TestUtility.poziceVelikost(autoXYM);
        TestUtility.poziceVelikost(autoXYB);
        TestUtility.poziceVelikost(autoXY);
        TestUtility.poziceVelikost(auto0);
    }


    public void testProhoďPoziceSKontrolou()
    {
        TestUtility.prohoďPoziceSKontrolou(auto0,   autoXYB);
        TestUtility.prohoďPoziceSKontrolou(autoXYB, autoXYM);
        TestUtility.prohoďPoziceSKontrolou(autoXYM, autoXYMB);
    }
    

    /***************************************************************************
     * Vyzkouší schopnosti auta při objíždění okruhů.
     */
    public void testPojízdnost()
    {
        TestUtility.objeďOkruh(new Auto());
    }


    /***************************************************************************
     * Vyzkouší schopnosti komparátoru ve třídě {@link TestUtility}
     * při řazení aut.
     */
    public void testSeřaďSeznam()
    {
        List<IModulový> seznam = new ArrayList<IModulový>();
        seznam.add(auto0);
        seznam.add(autoXY);
        seznam.add(autoXYB);
        seznam.add(autoXYM);
        seznam.add(autoXYMB);
        seznam.add(auto0);
        TestUtility.seřaďSeznam(seznam);
    }

}

